import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class GiftDynamicProxy implements InvocationHandler {
    
    Object target;  
    
    public Object bind(Object target) {  
        //截取了被绑定的、需要被代理的实例对象,交给类成员target  
        this.target = target;  
        //返回一个新的"代理实例",也就是说外部调用了bind方法以后,获取到的就不是传进来的那个实例对象了，而是被"封装"过的代理实例  
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
                target.getClass().getInterfaces(), this);  
    }  
    
    //在每次执行方法之前会被执行，反射出该实例的方法
    @Override
    public Object invoke(Object proxy,
                         Method method,
                         Object[] args) throws Throwable {
        Object result = null;  
        //获取礼物  
        getGift();  
        //拦截了真正的目标实例对象的方法以后,利用反射来自动调用相同方法  
        //this.target就是被代理的实例对象  
        //这里的args数组就是方法调用时传递的实参数组  
        result = method.invoke(this.target, args);  
        //方法调用完毕以后再赠予礼物  
        giveGift();  
        return result;  
    }
    public void getGift() {  
        System.out.println("获取了一个礼物");  
    }  
  
    public void giveGift() {  
        System.out.println("赠予一个礼物");  
    }  
}
